package GestionPlannification;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * Classe permettant d'accéder aux pieces de la base de données
 * @author Julien Reze
 */
class PieceBD {
    /**
     * Retourne tous les acteurs d'une pièce
     * @param p la pièce
     * @return le liste des acteurs trouvés
     * @throws java.sql.SQLException
     */
    static List<Artiste> getActeurs(Piece p) throws SQLException {
        Statement st = BD.UserBD.getStatement();
        List<Artiste> lesArtistes=new ArrayList();
        ResultSet rs= st.executeQuery("SELECT arti_id FROM joue WHERE piec_id="+p.getId()+"");
        while( rs.next( )){
            lesArtistes.add(Artiste.findEntitie(rs.getInt("arti_id")));
        }
        BD.UserBD.close(st);
        return lesArtistes;
    }

    /**
     * Retourne tous les auteurs d'une pièce
     * @param p la pièce
     * @return le liste des auteurs trouvés
     * @throws java.sql.SQLException
     */
    static List<Artiste> getAuteurs(Piece p) throws SQLException {
        Statement st = BD.UserBD.getStatement();
        List<Artiste> lesArtistes=new ArrayList();
        ResultSet rs= st.executeQuery("SELECT arti_id FROM ecrit WHERE piec_id="+p.getId()+"");
        while( rs.next( )){
            lesArtistes.add(Artiste.findEntitie(rs.getInt("arti_id")));
        }
        BD.UserBD.close(st);
        return lesArtistes;
    }

    /**
     * Recherche une piece dans la base de données grâce à son id
     * @param idPiece l'id de la piece recherchée
     * @return la piece trouvée
     * @throws java.sql.SQLException
     * @throws java.lang.Exception
     */
    static Piece readPiece(int idPiece) throws SQLException, Exception {
        Statement st = null;
        st=BD.UserBD.getStatement();
        ResultSet rs= st.executeQuery("SELECT * FROM piece WHERE piec_id="+idPiece+"");
        Piece p=new Piece(rs.getInt("piec_id"),rs.getString("piec_titre"),
                rs.getString("piec_resume"), Genre.findEntitie(rs.getInt("genr_id")),
                rs.getInt("piec_duree"), "");
        p.addActeurs(getActeurs(p));
        p.addAuteurs(getAuteurs(p));
        p.addRepresentations(Representation.searchRepresentation(p));
        BD.UserBD.close(st);
        return p;
    }

    /**
     * Retourne toutes les pieces de la base de données
     * @return la liste des pieces
     * @throws java.sql.SQLException
     */
    static List<Piece> realAllPiece() throws SQLException, Exception {
        Statement st = BD.UserBD.getStatement();
        List<Piece> lesPieces=new ArrayList();
        ResultSet rs= st.executeQuery("SELECT * FROM piece");
        while( rs.next( )){
            Piece p=new Piece(rs.getInt("piec_id"),rs.getString("piec_titre"), 
                    rs.getString("piec_resume"), GenreBD.readGenre(rs.getInt("genr_id")),
                    rs.getInt("piec_duree"), "");
            p.addActeurs(getActeurs(p));
            p.addAuteurs(getAuteurs(p));
            p.addRepresentations(Representation.searchRepresentation(p));
            lesPieces.add(p);    
        }
        BD.UserBD.close(st);
        return lesPieces;
        
    }

    /**
     * Sauvegarde la piece en base de données
     * @param piece la pièce à sauvergarder
     * @return l'id de la pièce en base de données
     * @throws java.sql.SQLException
     * @throws java.lang.Exception
     */
    public static int savePiece(Piece piece) throws SQLException, Exception {
        String rqt="INSERT INTO piece(piec_titre,piec_resume,piec_duree,genr_id) " +
                "VALUES(?,?,?,?)";
        PreparedStatement pst=BD.UserBD.getPreparedStatement(rqt);
        pst.setString(1,piece.getTitre());
        pst.setString(2, piece.getResume());
        pst.setInt(3, piece.getDuree());
        pst.setInt(4, piece.getGenre().getIdGenre());
        pst.execute();
        BD.UserBD.close(pst);
        System.out.println(piece.getTitre()+ " sauvegardé");
        List<Piece> l=realAllPiece();
        return (l.get(l.size()-1)).getId();
    }

    /**
     * Sauvegarde les auteurs d'une pièce en base de données
     * @param piece la pièce à sauvegarder
     * @throws java.sql.SQLException
     */
    public static void saveAuteurs(Piece piece) throws SQLException {
        Statement st = BD.UserBD.getStatement();
        String rqt;
        List<Artiste> lesAuteurs=piece.getAuteurs();
        for(int i=0;i<lesAuteurs.size();i++){
            rqt="INSERT INTO ecrit(piec_id,arti_id) " +
                "VALUES('"+piece.getId()+"','"+lesAuteurs.get(i).getId()+"')";
            st.executeUpdate(rqt);
        }
        BD.UserBD.close(st);
    }

    /**
     * Sauvegarde les acteurs d'une pièce en base de données
     * @param piece la pièce à sauvegarder
     * @throws java.sql.SQLException
     */
    public static void saveActeurs(Piece piece) throws SQLException {
        Statement st = BD.UserBD.getStatement();
        String rqt;
        List<Artiste> lesActeurs=piece.getActeurs();
        for(int i=0;i<lesActeurs.size();i++){
            rqt="INSERT INTO joue(piec_id,arti_id) " +
                "VALUES('"+piece.getId()+"','"+lesActeurs.get(i).getId()+"')";
            st.executeUpdate(rqt);
        }
        BD.UserBD.close(st);
    }

    /**
     * Met à jour les representations d'une pièce en base de données
     * @param piece la pièce à sauvegarder
     * @throws java.sql.SQLException
     */
    public static void updateRepresentations(Piece unePiece) throws SQLException {
        Statement st = BD.UserBD.getStatement();
        String rqt;
        List<Representation> lesRepresentations=unePiece.getRepresentations();
        for(int i=0;i<lesRepresentations.size();i++){
            if(lesRepresentations.get(i).getId()<=0){
                java.sql.Date dateSQL = new java.sql.Date(lesRepresentations.get(i).getDateRepresentation().getTime());
                rqt="INSERT INTO representation(repr_date,piec_id) " +
                    "VALUES('"+dateSQL+"','"+unePiece.getId()+"')";
                System.out.println(dateSQL+ "sauvegardé");
                st.executeUpdate(rqt);
            }
        }
        BD.UserBD.close(st);
    }

    /**
     * Sauvegarde les representations d'une pièce en base de données
     * @param piece la pièce à sauvegarder
     * @throws java.sql.SQLException
     */
    public static void saveRepresentations(Piece piece) throws SQLException {
        Statement st = BD.UserBD.getStatement();
        String rqt;
        List<Representation> lesRepresentations=piece.getRepresentations();
        for(int i=0;i<lesRepresentations.size();i++){
            java.sql.Date dateSQL = new java.sql.Date(lesRepresentations.get(i).getDateRepresentation().getTime());
            rqt="INSERT INTO representation(repr_date,piec_id) " +
                "VALUES('"+dateSQL+"','"+piece.getId()+"')";
            st.executeUpdate(rqt);
        }
        BD.UserBD.close(st);
    }

    /**
     * Met à jour les acteurs d'une pièce en base de données
     * @param piece la pièce à sauvegarder
     * @throws java.sql.SQLException
     */
    static void updateActeurs(Piece unePiece) throws SQLException {
        Statement st = null;
        st=BD.UserBD.getStatement();
        String rqt="DELETE from joue where piec_id="+unePiece.getId()+"";
        st.executeUpdate(rqt);
        BD.UserBD.close(st);
        saveActeurs(unePiece);
    }

    /**
     * Met à jour les auteurs d'une pièce en base de données
     * @param piece la pièce à sauvegarder
     * @throws java.sql.SQLException
     */
    static void updateAuteurs(Piece unePiece) throws SQLException {
        Statement st = null;
        st=BD.UserBD.getStatement();
        String rqt="DELETE from ecrit where piec_id="+unePiece.getId()+"";
        st.executeUpdate(rqt);
        BD.UserBD.close(st);
        saveAuteurs(unePiece);
    }

    /**
     * Met à jour une pièce en base de données
     * @param piece la pièce à sauvegarder
     * @throws java.sql.SQLException
     */
    static void updatePiece(Piece piece) throws SQLException {
        String rqt="UPDATE piece " +
                "SET piec_titre=?," +
                "piec_resume=?," +
                "piec_duree=?," +
                "genr_id=? " +
                "WHERE piec_id=?";
        PreparedStatement pst=BD.UserBD.getPreparedStatement(rqt);
        pst.setString(1,piece.getTitre());
        pst.setString(2, piece.getResume());
        pst.setInt(3, piece.getDuree());
        pst.setInt(4, piece.getGenre().getIdGenre());
        pst.setInt(5, piece.getId());
        pst.execute();
        BD.UserBD.close(pst);
        System.out.println(piece.getTitre()+ " mise à jour");
    }
}
